//
//  LZTStatusViewModel.swift
//  LZTWeibo
//
//  Created by Yin jianxun on 16/8/13.
//  Copyright © 2016年 YinJianxun. All rights reserved.
//

import UIKit

class LZTStatusViewModel: NSObject {
    
    //创建 status-model对象
    var statusModel: LZTStatusModel?
    
    //微博等级图片
    var mbrankImage: UIImage?
    
    //微博认证图片 verified
    var verifiedImage: UIImage?
    
    //微博来源
    var sinaSourceStr: String?
    
    //底部试图的各种按钮
    var repostsCountStr: String?
    var commentsCountStr: String?
    var attitudesCountStr: String?
    
    //微博时间 计算型属性-对应的对象发生改变时，此属性会被赋值新的值。  而存储型属性是对象已被创建出来就加载好数据不会再改变
    var sinaTimeStr: String? {
        
        return NSDate.getSinaDate(statusModel?.created_at ?? "").sinaDateDicription
    }
    
    //原创微博的微博正文的富文本
    var originalAttr: NSMutableAttributedString?
    
    //转发微博的微博正文的富文本
    var retweetAttr: NSMutableAttributedString?
    
    init(statusModel: LZTStatusModel) {
        super.init()
        
        self.statusModel = statusModel
        
        //微博等级图片
        mbrankImage = dealMbrank(statusModel.user?.mbrank ?? 0)
        
        //微博认证图片
        verifiedImage = dealVerifiedImage(statusModel.user?.verified ?? -1)
     
        //微博来源
        sinaSourceStr = dealSinaSource(statusModel.source ?? "")
        
        repostsCountStr = getSinaCountStr(statusModel.reposts_count ?? 0, title: "转发")
        commentsCountStr = getSinaCountStr(statusModel.reposts_count ?? 0, title: "评论")
        attitudesCountStr = getSinaCountStr(statusModel.reposts_count ?? 0, title: "赞")
        
        //
        originalAttr = sinaDealAttr(statusModel.text ?? "")
        retweetAttr = sinaDealAttr(statusModel.retweeted_status?.text ?? "")
        
    }
    
}

//获取 评论数等 分类扩展
extension LZTStatusViewModel {
    
    //获取 评论数等
    func getSinaCountStr(count: Int, title: String) -> String {
        
        if count <= 0 {
            return title
        }else if count > 0 && count < 10000 {
            return "\(count)"
        }else {
            let cFloat = CGFloat(count / 1000) / 10
            var cFloatStr = "\(cFloat)万"
            
            //整除1万的时候 .0省略
            if cFloatStr.containsString(".0") {
                cFloatStr = cFloatStr.stringByReplacingOccurrencesOfString(".0", withString: "")
            }
            return cFloatStr
        }
    }
}

//处理微博来源 分类拓展
extension LZTStatusViewModel {
    
    //处理微博来源
    func dealSinaSource(source: String) -> String{
        
        //判断 字符串中是否包含特殊字符
        if source.containsString("\">") {
            
            let startIndex = source.rangeOfString("\">")!
            let endIndex = source.rangeOfString("</")!
            
            //截取字符串
            let result = source.substringWithRange(startIndex.endIndex..<endIndex.startIndex)
            return "来自 \(result)"
        }
        return "来自 火星"
    }
    
}

extension LZTStatusViewModel {
    
    //处理微博正文中 富文本的显示内容  图片描述转成图片
    func sinaDealAttr(text: String) -> NSMutableAttributedString {
        
        //把传入的当前的字符串 转换成 可变的富文本
        let allTextAttr = NSMutableAttributedString(string: text)
        
        //正则表达式
        let regex = "\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]"
        
        /**
         *  对text进行正则匹配
         *
         regex 正则表达式
         count 匹配的个数
         result 匹配后的结果
         range 匹配的范围
         _ 代表是否终止的指针
         */
        /*
         text的正向遍历，会造成 out of bounds
         原因：text内容中有可能有多个需要进行转换的表情，一旦第一个转化完成，text的内容的位数就会发生变化，因此或造成
         后面的表情截取错位，崩溃。
         
         */
        //创建可遍数组 保存matchMode
        var matchArray: [LZTMatchModel] = [LZTMatchModel]()
        
        (text as NSString).enumerateStringsMatchedByRegex(regex) { (count, result, range, _) in
            
            //实例化 matchModel
            let model = LZTMatchModel(string: (result.memory as! String), range: range.memory)
            
            //添加模型
            matchArray.append(model)
            
            //memory可以看到指针所指向的和保存的 内容
            //print(result.memory, range.memory)
            
        }
        
        //倒序遍历数组
        for matchModel in matchArray.reverse() {
            
            guard let emoticonModel = LZTEmoticonTools.sharedTools.searchEmoticonInDefaultOrLxh(matchModel.string) else {
                //return
                continue
            }
            
//            //创建一个文字附件
//            let att = NSTextAttachment()
//            
//            //设置 文字附件的Image
//            att.image = UIImage.emoticonImage(emoticonModel)
//            
//            //设置bounds
//            let lineHeight = UIFont.systemFontOfSize(15).lineHeight
//            att.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
//            
            //创建一个不可变的富文本 用于显示微博内容中的表情
            let attr = NSAttributedString.emoticonAttributedString(emoticonModel, textFont: 15, y: -4)
            
            //替换 将传入的富文本内容用转换后的表情进行替换
            allTextAttr.replaceCharactersInRange(matchModel.range, withAttributedString: attr)
        }
        
        
        //返回一个 替换后的富文本
        return allTextAttr
    }
    
}

//处理cell的数据逻辑
extension LZTStatusViewModel {
    
    //判断等级的图像显示
    func dealMbrank(mbrank: Int)-> UIImage? {
        
        if mbrank > 0 && mbrank < 7 {
            return UIImage(named: "common_icon_membership_level\(mbrank)")
        }
        return UIImage(named: "common_icon_membership")
    }
    
    //用户认证 verified
    func dealVerifiedImage(verified: Int)-> UIImage? {
        
        switch verified {
        case 1:
            return UIImage(named: "avatar_vip")
        case 2,3,5:
            return UIImage(named: "avatar_enterprise_vip")
        case 220:
            return UIImage(named: "avatar_grassroot")
        default:
            return UIImage(named: "avatar_vgirl")
        }
        
    }
    
}
